Tip9 以类族模式隐藏实现细节

context

类族是一种很有用的模式,可以隐藏抽象基类背后的细节.OC的系统框架中,普遍使用这个模式.

一个例子: UIButton

1
UIButton * button = [UIButton buttonWithType];

该方法返回的对象类型取决于传入的 type ,不同的type决定了这个 button 将来的一些属性的不同(或者说可供设置的属性的不同)

要实现类似的功能,如果不用类族,那么还可能是一个类中的枚举.比如:

1
2
3
4
5
6
7
8
- (void) drawRect:(CGRect)rect{
if(_type == typeA){
//绘制一个 typeA 类型的 Button
}else if (_type == typeB){
//绘制一个 typeB 类型的 Button
}

}

这是一个简单的类型,这么看来没有问题,但是如果类型太多,这样就显得非常笨拙了.

稍微聪明一点的程序员,会把这样的代码重构.不同的实现放到子类中,父类中存放公共代码.但是这样也有一个缺点,就是开发者需要知道所有的子类.

现在类族的好处就显而易见了.

一个自定义的类族

假设我们有一个 Person 类,Person 分为不同的职业.有老师,学生,医生.那么类族的实现应该是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
typedef NS_ENUM(NSUInteger,PersonType) {
PersonTypeDoctor,
PersonTypeTeacher,
PersonTypeStudent
};

+ (Person *) personWithType:(PersonType)type{
switch(type){
case PersonTypeDoctor:
return [[PersonDoctor alloc]init];
break;
case PersonTypeTeacher:
return [[PersonTypeTeacher alloc]init];
break;
case PersonTypeStudent:
return [[PersonTypeStudent alloc]init];
break;

}

}